package com.sf.rbac.service.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.sf.rbac.anno.RequiredPermission;
import com.sf.rbac.domain.Permission;
import com.sf.rbac.domain.Role;
import com.sf.rbac.ex.BusinessException;
import com.sf.rbac.mapper.PermissionMapper;
import com.sf.rbac.mapper.RoleMapper;
import com.sf.rbac.qo.QueryObject;
import com.sf.rbac.service.IPermissionService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RestController;

import java.lang.reflect.Method;
import java.util.Collection;
import java.util.List;
import java.util.Map;

@Service
public class PermissionServiceImpl implements IPermissionService {
    @Autowired
    private PermissionMapper permissionMapper;

    @Autowired
    private ApplicationContext ctx;

    @Autowired
    private RoleMapper roleMapper;
    @Override
    public PageInfo<Permission> query(QueryObject queryObject) {
        // 告诉pagehelper  页容量和页大小
        PageHelper.startPage(queryObject.getPageNum(), queryObject.getPageSize());
        //调用分页方法
        List<Permission> list = permissionMapper.selectForList();
        return new PageInfo<>(list);
    }

    /**
     * 加载权限
     */
    @Override
    public void load() {
        // 0 先从数据库中查找所有的权限的表达式
         List<String> expressions=permissionMapper.selectExpressions();
        // 1从spring 容器中获取所有的controller
        Map<String, Object> map = ctx.getBeansWithAnnotation(RestController.class);
        //map  的key 是controller 的名字    values 才是我们要的
        Collection<Object> controllers = map.values();
        // 2 遍历controller
        for (Object controller : controllers) {
            // 3 通过controller 获取方法
            Method[] methods = controller.getClass().getMethods();
            // 4 遍历方法数组
            for (Method method : methods) {
                // 5 通过方法获取 方法头上的注解
                RequiredPermission annotation = method.getAnnotation(RequiredPermission.class);
                // 6 判断注解是否为空
                if (annotation != null) {
                    // 7 如果不为空 从注解里获取name 和expression
                    String name = annotation.name();
                    String expression = annotation.expression();
                    // 判断数据库中是否存在权限表达式  如果不存在就保存
                    if(!expressions.contains(expression)){
                        // 8 将name 和expression 设置到permission 对象中
                        Permission permission = new Permission(null, name, expression);
                        // 9 将permission 添加到数据库中
                        permissionMapper.insert(permission);
                    }

                }

            }

        }

    }

    @Override
    public List<Permission> queryPermission(Long id) {
        // 1 根据id 查询角色
        Role role = roleMapper.get(id);
        // 2 判断角色是否为空
        if(role==null) {
         throw new BusinessException("非法操作");
        }
        // 3 根据角色Id 查询权限集合信息
        List<Permission>  permissions = permissionMapper.queryPermissionByRId(role.getId());
        return permissions;
    }

    @Override
    public List<Permission> listAll() {

        return permissionMapper.listAll();
    }
}
